package com.yanggu.scala.chapater18.myimplicit

/**
 * 1、Scala中的两种隐式转换机制以及隐式视图的定义方式
 * 2、Scala中的隐式绑定可能所处的位置以及如何更好的使用隐式转换
 * 3、Scala中的隐式转换相关操作规则
 * 4、Scala中的隐式参数
 * 5、Scala中的隐式类
 * 6、Scala中的隐式对象
 * 7、Scala中的两种隐式类型约束(结合Scala中的类型系统)
 * 8、Predef类中的implicitly方法的用法介绍以及Ordering类型转化为Ordered类型的方式
 */
/**
 * ⑴隐式转换函数或者方法
 * ②隐式视图是指把一种类型自动转换成另外一种类型，进而使用另外一种类型中的属性和方法,从而满足表达式的要求.
 * 隐式视图的定义一般用如下形式:
 * 声明格式: implicit def functionName(argName: OriginalType): ViewType = {转换的逻辑}
 * 作用:如果在隐式作用域里存在这个定义,它会隐式地把原始类型的值转换为增强之后的类型的值(在需要的时候).
 * ⑵隐式值和隐式视图都采用相同的隐式解析机制,所谓隐式解析是指如果编译器发现代码里缺少部分信息，进而查找缺失信息的过程。在Scala当中,隐式解析一般分为两个阶段:在隐式转换的作用域查找中，如果当前作用域没有隐式转换，编译器会自动到相应源或目标类型的伴生对象中查找隐式转换。
 * ⑶在Scala当中,隐式视图即隐式函数的命名一般这样写:前面是转换之前的类型,后面是增强之后的类型,如int2Integer。并且函数的参数一般是转换之前的类的实例,函数的执行体就是创建一个增强类对象.
 * ⑷在隐式视图中,增强类的主构造器的参数类型一般是转换之前的类的类型,并且增强类中含有我们想要的方法。
 */
//通过伴生类与伴生对象机制，编译器将会自动导入隐式转换， 而无需用户手动导入隐式转换。
object ImplicitDemo01 {

  def main(args: Array[String]): Unit = {
    //1. 隐式函数或者方法
    //例如在Predef类中定义了隐式准换方法
    //implicit def int2Integer(x: Int): java.lang.Integer = x.asInstanceOf[java.lang.Integer]

    //这里定义了一个隐式变量
    implicit val str = "Scala"
    //这里使用了隐式参数
    def fun(implicit str: String) = println(s"Hello $str")
    fun(str)
    //这里不用传递str
    fun
    //这里定义了一个隐式函数
    def g(str: String) = println(s"Hello $str")
    implicit def int2String(num: Int) = num.toString
    g(100)
  }

}
